/* 
 * File:   complexArrayProduct.c
 * Author: pablo
 *
 * Created on 18 de agosto de 2011, 07:44 PM
 */

#include "mex.h"

/* The computational routine */
void complexArrayProduct(double *realF1, double *imF1, double *realF2 , double *imF2, double *realSalida, double *imSalida, mwSize m, mwSize n) {
/* Tomo dos matrices MxN que son N transformadas de Fourier de funciones (solo el semieje f>0) y calculo el producto interno de las funciones en el tiempo*/
    /*salida es 1xn*/
int i;
int j;
for(i=0;i<n;i++){
    for(j=0;j<m;j++){
        realSalida[m*i+ j]   =   realF1[m*i+j]*realF2[m*i+j] - imF1[m*i+j]*imF2[m*i+j];
        imSalida[m*i+j]     =   realF1[m*i+j]*imF2[m*i+j] + imF1[m*i+j]*realF2[m*i+j]; 
    }
}
}

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    /* nrhs es el número de inputs desde matlab, *prhs es el puntero a una estructura que los contiene*/
    /* nlhs es el número de salidas y *plhs es el puntero a la estructura que los contendrá*/
    
    double *in1Real;               /* MxN input matrix (fila) */
    double *in1Im;               /* MxN input matrix (fila) */
    double *in2Real;               /* MxN input matrix (fila) */
    double *in2Im;               /* MxN input matrix (fila) */
    mwSize M;                   /* size of matrix */
    mwSize N;                   /* size of matrix */
    double *outMatrixReal;              /* MxN output matrix */
    double *outMatrixIm;              /* MxN output matrix */
    
     /* check for proper number of arguments */
    if(nrhs!=2) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayProduct:nrhs","Two inputs required.");
    }
    if(nlhs!=1) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayProduct:nlhs","One output required.");
    }
    /* check that size of both arguments is equal */
    if(mxGetM(prhs[0])!=mxGetM(prhs[1]) || mxGetN(prhs[0])!=mxGetN(prhs[1])) {
        mexErrMsgIdAndTxt("MyToolbox:complexArrayProduct:notEqualSize","Inputs must be equal in size.");
    }


    /* inputs */
    in1Real = mxGetPr(prhs[0]);
    in1Im = mxGetPi(prhs[0]);
    in2Real = mxGetPr(prhs[1]);
    in2Im = mxGetPi(prhs[1]);
    M = mxGetM(prhs[0]);
    N = mxGetN(prhs[0]);

    /* create the output matrix */
    plhs[0] = mxCreateDoubleMatrix(M,N,mxCOMPLEX);

    /* get a pointer to the real data in the output matrix */
    outMatrixReal = mxGetPr(plhs[0]);
    outMatrixIm = mxGetPi(plhs[0]);

    /* call the computational routine */
    complexArrayProduct(in1Real, in1Im, in2Real, in2Im, outMatrixReal, outMatrixIm, M ,N);
}

